#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define PATH 	"/sys/bus/w1/devices/"		//宏定义默认路径
#define BUF_SIZE	 128
#define PATH_SIZE	 100

int main(int argc, char **argv[])
{
	char			path[PATH_SIZE] = PATH;		//局部变量保存默认路径
	DIR				*dir;						//opendir的返回类型，用来指定打开的文件夹
	struct dirent   *direntp;					//readdir返回的结构体指针，用来指向打开文件夹的内容
	char			dstfile[48];				//目标路径缓存区
	int 			flag = -1;					//初始化文件夹读取成败标志
	int				fd = -1;					//初始化文件描述符
	int				rv = -1;					//初始化文件读取返回值
	char			buf[BUF_SIZE];				//实时温度缓冲区
	double			tem = 0.00;					//初始化实时温度数据	
	char			*ptr = NULL;				//初始化实时温度缓冲区指针


	if((dir = opendir(path)) == NULL )							//打开文件夹并判断成败
	{
		printf("Open directory failed: %s", strerror(errno));	//失败打印提示
		return -1;
	}

	while((direntp = readdir(dir)) != NULL)						//读取文件夹内容，用direntp保存其地址
	{
		if(strstr(direntp->d_name, "28"));						//找到“28-”开头的文件夹
		{
			strcpy(dstfile, direntp->d_name);					//将目标路径文件夹保存到缓冲区

			flag = 1;											//成功找到“28-”开头的文件夹的标志，
		}
	}


	closedir(dir);								//关闭文件夹

	if(flag != 1)												//利用标志判断有没有成功找到“28-”开头的文件夹
	{
		printf("Can not found the temperature file.\n");		
		return -2;
	}

	
	strncat(path, dstfile, sizeof(path));				//给默认路径加上找到的“28-”开头的文件夹
	strncat(path, "/w1_slave", sizeof(path));			//继续加上需要打开的文件“w1_slave”,这样就完成了目标路径的更新


	if((fd = open(path, O_RDONLY)) < 0 )				//根据目标路径以只读的形式打开文件，同样加上错误判断
	{
		printf("Open temperature file failed: %s\n", strerror(errno));		//出错提醒
		return -3;
	}

	if((rv = read(fd, buf, sizeof(buf))) < 0)			//读取文件内容，并保存在buf里
	{
		printf("Read temperature data failed: %s\n", strerror(errno));
		return -4;
	}

	close(fd);

	if((ptr = strstr(buf, "t=")) != NULL)			//strstr()找到温度存放的地址,并保存起来
	{
		tem = atof(ptr+2)/1000;						//这里加2是讲地址便宜两个字节，跳过文件中的“t=”，只保留有用的温度数据
		printf("The temperature in LingYun Studio is %f now.\n", tem);		//简单粗暴，快哉！
	}
	else
	{
		printf("Can not read the temperature data: %s.\n", strerror(errno));	//buf里面没有读取到温度数据，就会报错
		return -5;
	}

	return 0;							// ending
}

